零基础如何自学 XCPC

如标题,这又是一篇 XCPC 教学贴

声明:本教程适用于弱校零基础 XCPCer,强校的同学们去问教练,oier 根据高中水平不同选择不同的路

何为弱校?

比赛介绍

XCPC

赛制介绍

ICPC/ACM 赛制

一般是三个人组成一队使用一台机器,在比赛时有多次提交机会。比赛实时评测并返回结果,如果提交的结果错误会有 20 分钟的罚时,错误次数越多,加罚的时间也越长。每个题目只有在所有数据点全部正确后才能得到分数。比赛排名根据做题数来评判,做题数相同的,根据总用时来评判。总用时是每题用时的和。每题的用时是从比赛开始到做出该题的分钟数与该题的罚时之和。

一些 ICPC 相关赛事中,比赛结束前一小时进行封榜,封榜后的提交和排名将无法被其他选手看见。

在 ICPC 相关赛事中,选手允许带一定量的纸质资料。

赛季赛程

学习路线

我粗浅得把算法竞赛的学习分成三个阶段,包含了从入门到能达到区域赛银牌的水平,每个阶段有不同的学习侧重点和目标

  1. 语法阶段
  2. 基础算法阶段
  3. 进阶算法阶段

接下来我会分阶段展开讲一讲

大家可以根据学习目标看自己达到了哪个水平,切记切记不要好高骛远

语法阶段

推荐时间:一个月 ~ 两个月,不宜拉的过长

需要掌握

image.png

知识输入

主要分三个方面,听课,看书,看大佬的博客

这个阶段还是比较推荐看一些付费或者免费的网课的,看书相对来说比较枯燥,可以自己选择,方法不是重要的,重要的要掌握知识点

比较推荐的网课有:

推荐书目:

刷题

这个阶段不建议大量的刷题,但最基本的刷题量还是要有的

如果你报了网课,那么跟着老师的课后题即可,如果有书,看看书后的课后题,当然自己也可以找一些题来做

雷区

Q & A

算法入门

推荐时间:三个月到一年

这个阶段是成长最快的阶段,需要学习的东西很多

这个阶段基本还是靠知识输入,但是也要加强刷题了,我觉得应该是一半一半,此阶段结束时,至少达到 1000 题的刷题量(水题除外)

image.png

需要掌握

应该掌握 青色(入门),绿色(铜牌)的算法

知识输入

和上阶段类似,如何学算法:看课 + 看书 + 找大佬的博客看

如果看书看的进去,认准一本书,若有哪个算法书上看了好几次都看不懂的,就去google 搜博客看或者 B 站找视频理解看,看完之后,找书后的题单,把例题和习题全部做了,做不来的上网搜题解,写完后自己写博客总结

比较推荐的书目如下:

当然如果报了课的,课后老师会给题单,把老师的题写了,要注意一下看课容易陷入一种自己已经懂了但没有懂的境界,需要把课关掉,拿出一张白纸,然后自己推一次

比较推荐的网课如下:

付费的和收费的都有,就目前来看,付费的课程要系统一些,B 站免费的课程在个别知识点上讲的不错

一个算法不要卡太久,大约一周要完成一个算法,如果觉得题很多,那也没必要全部刷完,刷到什么程度ok,就是达到把显示器关掉能打出算法的核心代码(默写算法过程)

对于前面留下的 STL 算法,应该在这个时候补齐

刷题

这个阶段的刷题除了上面提到的针对学的算法的刷题还需要打一些网络赛

网络赛和刷题是完全不同的节奏,缺一不可

现在能打的网络赛:

codeforces 的 div3,div4,有能力的可以打 div2,cf 的风格比较偏向于近年来的区域赛签到题,cf 分数来业内也是硬通货,强烈要求打

codeforces

CodeForce使用说明超详细!!!!! 使用油猴插件 codeforse better 可以翻译英文题面,用法自行百度

atcoder 的 atcoder beginer contest,简称 abc,atcoder abc 的题目都是非常非常经典的模版题,适合新手打,如果赛场上除了一个很经典的题但是你没做过就会很亏,基本奠定了此场比赛的结束

atcoder

AtCoder从小白到大神的进阶攻略同理,使用油猴插件 atcoder better 可以翻译英文题面,用法自行百度

牛课竞赛的算法周赛,小白月赛,这个的好处就是牛课竞赛的 B 站账号都会有人讲解,而且可以进群问问题,对小白比较友好,但是小白月赛的前几题通常比较烦,个人不是很喜欢,但锻炼基本功

牛客竞赛的B站账号

打完比赛后一定一定要补题!!!

对于不会做的题,看题解把题搞懂,已经做出来的题,也去扫一眼题解,看一下 jiangly 代码,往往有非常优雅的解法

打完比赛之后如何补题?B 站搜这个比赛名称视频,有很多更新的佬,或者去google或者知乎搜题解,或者群里问,一般刚刚结束的比赛大家都在补,看到会回答的,英语水平比较好的可以直接看 cf 和 at 的官方题解,at 的官方题解往往写得非常好

补到什么程度?一般补到自己没做出来的那一题的下一题,比如说我卡在第 3 题了,我可以把第 3 题补了,然后再看一下第 4 题有没有想法

补题遇到自己不会的算法了怎么办?看上面那个图,如果是铜牌要求一下可以顺便把这个算法学了,如果过难不建议学,会耗费大量时间并拖慢主线任务

雷区

Q & A

vjudge vjudge 的题单,里面有很多大佬整理的题单,也有书本后面的习题

Virtual Judge使用指南

算法进阶

这个时候就不太建议使用 dev-C++ 了,可以看一下区域赛的网络配置,使用 vscode + ubuntu 进行训练

需要掌握

这个阶段,对算法训练有自己的理解,并能自己指定计划了,接下来是我给的一些建议,仅供参考

image.png

知识输入

这个阶段的知识输入应该减少,需要大量刷题锻炼思维,然后通过题来补充自己的算法漏洞

组队后和队友分方向,例如:动态规划,图论,字符串,计算几何,然后深耕这个方向,其他方向了解即可

很多书上没有到达这个难度,需要看一些大佬博客或者B站搜这个算法学习,由于这个阶段的算法难度较大,只要做到带板子把题能做出来即可。

这个看一下这个大佬的方法:知乎 cup-pyy 又一篇算法竞赛阶段总结和经验分享

刷题

刷题分为两个方面:组队训练和个人训练

个人训练不建议刷板子题,还是冲 codeforces , atcoder 和牛课

如果自己日常想刷题:找自己 cf 分 + 300 左右的 rating,进行板刷,当觉得简单调高 rating,觉得难减少 rating,不要找太难或者太简单的题做,没有意义

组队训练的话,可以 vp:

组队完一起补题,建议补到金牌题以下

大致学习思路是:刷题 补题 查漏补缺找到不会的算法 把算法学了 找几道相关的题目再练练手

赛后一定一定一定要记得补题,补题的重要性远远大于做新的题

可以看一些与算法没有直接相关,但是能给人很多启发的书

雷区

书目获取链接:https://pan.baidu.com/s/1-0wB2Q8T_8cDxdNMZoOTXg,密码:rt5m